package com.android.presenter;

import android.os.CountDownTimer;
import android.os.Handler;
import android.text.TextUtils;

import com.android.app.CommonType;
import com.android.app.constant.UrlConstants;
import com.android.model.entity.res.QuoteStockInfoSnapData;
import com.android.model.entity.res.QuoteStockMinutesData;
import com.android.model.net.AppBaseNetWork;
import com.android.presenter.contract.HqFenXianContract;
import com.android.util.DateUtils;
import com.android.util.JsonUtil;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.mp.chart.charts.MinutesChart;

import org.greenrobot.eventbus.EventBus;
import org.joda.time.DateTime;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import okhttp3.Call;
import okhttp3.Response;

public class HqFenXianPresenter implements HqFenXianContract.Presenter {

    private HqFenXianContract.View view = null;
    private static final String TAG = "HqFenXianPresenter";
    private QuoteStockMinutesData quoteStockMinutesData;
    private volatile List<QuoteStockMinutesData.DataBean> minutesDataBeanList;
    private MinutesChart chart;

    public HqFenXianPresenter(HqFenXianContract.View view, String code, String day, MinutesChart minutesChart) {
        this.view = view;
        this.chart = minutesChart;
//        EventBus.getDefault().register(this);
//        if (quoteStockInfoTimer != null) {
//            quoteStockInfoTimer.start();
//        }
    }
//
//    private CountDownTimer quoteStockInfoTimer = new CountDownTimer(24 * 60 * 60 * 1000, 500) {
//
//        @Override
//        public void onTick(long millisUntilFinished) {
//            try {
//                long mainStamp = AppBaseNetWork.getInstance().getMainStamp();
//                String mainDateStr = DateUtils.getDateToMDHm(mainStamp);
//                String dateStr = DateUtils.getDateToMDHm(System.currentTimeMillis());
//                if (mainDateStr.equals(dateStr)) {
//                    //清理视图数据
//                    if (minutesDataBeanList != null) {
//                        minutesDataBeanList.clear();
//                    }
//
//                    if (chart != null) {
//                        chart.setShinePointStatus(true);
//                    }
//                    if (view != null) {
//                        view.updateHqInfo(minutesDataBeanList);
//                    }
//
//                    //清理快照数据
//                    aMinuteSnapList.clear();
//                    beforeMinData = null;
//                    allSnapList.clear();
//                    quoteStockInfoTimer.cancel();
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//
//        @Override
//        public void onFinish() {
//        }
//    };
//

    @Override
    public void getLine() {

//        Log.e(TAG, "==第" + questCount + "次调用getLine");

        loadData("");

    }

    @Override
    public void getNewLine() {
//        Log.e(TAG, "==第" + questCountNews + "getNewLine");
//        loadNewData(QuoteStockInfoActivity.stockCode);
    }

    private int errorCount = 0;
    //getBar数据是否有响应(分时历史数据接口是否有响应）
    private boolean getBarResponse = false;

    /**
     * 首次加载数据
     *
     * @param stockCode 股票代码
     */
    private void loadData(final String stockCode) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {


        OkGo.get(UrlConstants.HOST_HTTPS + UrlConstants.MARKET_SUMMARIZED)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        quoteStockMinutesData = JsonUtil.parseJsonToBean(s, QuoteStockMinutesData.class);
                        if (quoteStockMinutesData != null) {
                            minutesDataBeanList = quoteStockMinutesData.getData();
                            String status = quoteStockMinutesData.getStatus();
                            if (!TextUtils.isEmpty(status) && view != null) {
                                //1.补全历史的空数据 与 快照前几分钟的空数据
                                //a.补全历史空数据
                                //b.补全快照前几分钟的空数据
                                view.updateHqInfo(minutesDataBeanList);
                            }
                        }
                        getBarResponse = true;

                    }

                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        errorCount++;
                        if (errorCount <= 3) {
                            loadData(stockCode);
                        } else {
                            getBarResponse = true;
                        }
                    }
                });
            }
        }, 3000);
    }


    @Override
    public void start() {
    }

    @Override
    public void onDestroy() {
//        EventBus.getDefault().unregister(this);
//        if (quoteStockInfoTimer != null) {
//            quoteStockInfoTimer.cancel();
//        }
    }


//    @Subscribe
//    public void onEventMainThread(BusUtils.BusSnapData busData) {
//
//        try {
//            final QuoteStockInfoSnapData data = busData.getData();
//            if (getBarResponse && !TextUtils.isEmpty(QuoteStockInfoActivity.stockCode)
//                    && data.getData().getCode().equals(QuoteStockInfoActivity.stockCode)) {
//                AppBaseNetWork.getInstance().isStockOpeningTime(new AppBaseNetWork.StateCallback() {
//                    @Override
//                    public void isSuccess(boolean isSuccess) {
//                        if (isSuccess) {
//                            //快照数据转分时数据
//                            final QuoteStockMinutesData.DataBean dataBean = snapDataToMin(data);
//                            chart.setShinePointStatus(true);
//                            handleLastMinData(dataBean);
//                        } else {
//                            chart.setShinePointStatus(false);
//                        }
//                    }
//                });
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    /**
     * 存放某一分钟的快照数据
     */
    private List<QuoteStockInfoSnapData.DataBean> aMinuteSnapList = new ArrayList<>();
    private QuoteStockInfoSnapData.DataBean beforeMinData;
    private List<QuoteStockInfoSnapData.DataBean> allSnapList = new ArrayList<>();//保存快照的所有数据

//    /**
//     * 快找数据转为分时数据
//     *
//     * @param data data
//     * @return data
//     */
//    private synchronized QuoteStockMinutesData.DataBean snapDataToMin(QuoteStockInfoSnapData data) {
//        QuoteStockMinutesData.DataBean minData = new QuoteStockMinutesData.DataBean();
//        try {
//            //如果集合为空则new一个新的集合
//            if (minutesDataBeanList == null) {
//                minutesDataBeanList = new ArrayList<>();
//            }
//            //计算分时最新计算方法 9:30只取出快照数据作为这一分钟的数据
//            final QuoteStockInfoSnapData.DataBean snapData = data.getData();
//            float price = Float.parseFloat(snapData.getPrice() + "");
//            float prev = Float.parseFloat(snapData.getPrev() + "");
//            float volume = Float.parseFloat(snapData.getVolume() + "");
//
//
////            DateTime snapDateTime = DateUtils.parseSnapDate(snapData.getDealtime());
//
////            Log.e(TAG, "snapDateTime=" + snapDateTime.toString());
//
//            long originalTimeStamp = DateUtils.parseSnapDate(snapData.getDealtime()).toDate().getTime();
//
//            String dealTime = snapData.getDealtime();
//
//            Log.e(TAG, "dealTime=" + dealTime);
//            if (dealTime.contains("-0400")) {
//                dealTime = dealTime.replace("-0400", "+0800");
//            } else if (dealTime.contains("-0500")) {
//                dealTime = dealTime.replace("-0500", "+0800");
//            }
//            Date date = new Date(dealTime);
//
//            DateTime snapDateTime = new DateTime(date.getTime());
//            int snapDayOfMonth = snapDateTime.getDayOfMonth();
//            int snapMinuteOfDay = snapDateTime.getMinuteOfDay();
//            int snapMillisOfDay = snapDateTime.getMillisOfDay();
//
//
//            float change = BigDecimalUtils.sub(price, prev, 2);
//            float div = BigDecimalUtils.div(change, prev, 4);
//            float percent = BigDecimalUtils.mul(div, 100, 2);
//
//            long snapTimeStamp = date.getTime();
//
//
//            //快照数据如果为九点三十这个点 将快照数据直接转换为分时数据
//            if (snapDateTime.toString().contains(AppBaseNetWork.americanStockOpenTime)) {
//                minData.setCurrent(price);
//                minData.setPercent(percent);
//                minData.setLast_close(snapData.getPrev());
//                minData.setChange(snapData.getChange());
//                minData.setVolume(volume);
//                minData.setAvg(price);//均价暂无法计算
//                minData.setTime(snapTimeStamp);
//                minData.setNYTime(originalTimeStamp);
//
//                //清理快照数据
//                aMinuteSnapList.clear();
//                beforeMinData = null;
//                allSnapList.clear();
//
//                return minData;
//            }
//
//            int aMinSnapListSize = aMinuteSnapList.size();
//            if (aMinSnapListSize == 0) {
//                aMinuteSnapList.add(snapData);
//            } else {
//                QuoteStockInfoSnapData.DataBean lastSnapBean = aMinuteSnapList.get(aMinSnapListSize - 1);
//                String lastDealTime = lastSnapBean.getDealtime();
//                if (lastDealTime.contains("-0400")) {
//                    lastDealTime = lastDealTime.replace("-0400", "+0800");
//                } else if (lastDealTime.contains("-0500")) {
//                    lastDealTime = lastDealTime.replace("-0500", "+0800");
//                }
//                Date lastSnapDate = new Date(lastDealTime);
//                DateTime lastSnapDateTime = new DateTime(lastSnapDate.getTime());
//
//                int lastSnapMinuteOfDay = lastSnapDateTime.getMinuteOfDay();
//                int newSnapMinuteOfDay = snapDateTime.getMinuteOfDay();
//
//                int lastSnapMillisOfDay = lastSnapDateTime.getMillisOfDay();
//                int newSnapMillisOfDay = snapDateTime.getMillisOfDay();
//
//                //如果不是同一分钟的数据则清理数据
//                if (lastSnapMinuteOfDay != newSnapMinuteOfDay) {
//                    beforeMinData = aMinuteSnapList.get(aMinSnapListSize - 1);
//                    aMinuteSnapList.clear();
//                }
//
//                //秒数不同才添加
//                if (lastSnapMillisOfDay != newSnapMillisOfDay) {
//                    aMinuteSnapList.add(snapData);
//                }
//            }
//
//            int allSnapListSize = allSnapList.size();//快照集合数据条数
//            int minListSize = minutesDataBeanList.size();//分时历史数据条数
//            aMinSnapListSize = aMinuteSnapList.size();//重新计算一分钟快照的list大小
//            if (allSnapListSize == 0) {
//                //还没有存储过快照数据
//                if (minListSize != 0) {
//
//                    final QuoteStockMinutesData.DataBean historyEntity = minutesDataBeanList.get(minListSize - 1);
//                    DateTime historyDateTime = new DateTime(historyEntity.getTime());
//                    int historyDayOfMonth = historyDateTime.getDayOfMonth();
//                    int historyMinuteOfDay = historyDateTime.getMinuteOfDay();
//
//
//                    //如果进来的快照数据与历史数据的小时分钟都相同
//                    if (historyDayOfMonth == snapDayOfMonth && historyMinuteOfDay == snapMinuteOfDay) {
//                        snapData.setCurrentVolume(new BigDecimal(historyEntity.getVolume()));
//                    } else {
//                        //通过收盘时间判断是否是最后一条数据
//                        AppBaseNetWork.getInstance().isStockOpeningTime(new AppBaseNetWork.StateCallback() {
//                            @Override
//                            public void isSuccess(boolean isSuccess) {
//                                if (isSuccess) {
//                                    snapData.setCurrentVolume(BigDecimal.ZERO);
//                                } else {
//                                    snapData.setCurrentVolume(new BigDecimal(historyEntity.getVolume()));
//                                }
//                            }
//                        });
//                    }
//
//                    snapData.setAmount(new BigDecimal(snapData.getVolume()).multiply(new BigDecimal(historyEntity.getAvg())));
//
//                } else {
//                    //取快照里边的成交量
//                    snapData.setCurrentVolume(new BigDecimal(snapData.getVolume()));
//                    //取快照里边的价格乘以成交量
//                    snapData.setAmount(new BigDecimal(snapData.getPrice()).multiply(new BigDecimal(snapData.getVolume())));
//                }
//                allSnapList.add(snapData);
//            } else {
//
//                //已经有了一条快照数据了
//                if (minListSize != 0) {
//                    //当前两个快照成交量的差值
//                    BigDecimal currentVolume = new BigDecimal(snapData.getVolume()).subtract(new BigDecimal(allSnapList.get(allSnapListSize - 1).getVolume()));
//                    //当前快照差值的成交额
//                    BigDecimal currentAmount = currentVolume.multiply(new BigDecimal(snapData.getPrice()));
////                    历史快照的成交额加上 相邻两条快照的成交额
//                    snapData.setAmount(allSnapList.get(allSnapListSize - 1).getAmount().add(currentAmount));
//                    final QuoteStockMinutesData.DataBean historyEntity = minutesDataBeanList.get(minListSize - 1);
//
//
//                    int aMinuteSnapListSize = aMinuteSnapList.size();
//                    if (aMinuteSnapListSize >= 2) {
//                        if (beforeMinData != null) {
//                            snapData.setCurrentVolume(new BigDecimal(aMinuteSnapList.get(aMinSnapListSize - 1).getVolume()).subtract(new BigDecimal(beforeMinData.getVolume())));
//                        } else {
//                            snapData.setCurrentVolume(new BigDecimal(aMinuteSnapList.get(aMinSnapListSize - 1).getVolume()).subtract(new BigDecimal(aMinuteSnapList.get(0).getVolume())));
//                        }
//                    } else {
//                        if (beforeMinData != null) {
////                            snapData.setCurrentVolume(new BigDecimal(aMinuteSnapList.get(aMinuteSnapList.size() - 1).getVolume()).subtract(new BigDecimal(beforeMinData.getVolume())));
//                            snapData.setCurrentVolume(new BigDecimal(snapData.getVolume()).subtract(new BigDecimal(beforeMinData.getVolume())));
//                        } else {
//
//                            //如果进来的快照数据与历史数据的小时分钟都相同
//
//                            DateTime historyDateTime = new DateTime(historyEntity.getTime());
//                            int historyDayOfMonth = historyDateTime.getDayOfMonth();
//                            int historyMinuteOfDay = historyDateTime.getMinuteOfDay();
//
//                            if (historyDayOfMonth == snapDayOfMonth && historyMinuteOfDay == snapMinuteOfDay) {
//                                snapData.setCurrentVolume(new BigDecimal(historyEntity.getVolume()));
//                            } else {
//                                //通过收盘时间判断是否是最后一条数据
//
//                                AppBaseNetWork.getInstance().isStockOpeningTime(new AppBaseNetWork.StateCallback() {
//                                    @Override
//                                    public void isSuccess(boolean isSuccess) {
//                                        if (isSuccess) {
//                                            snapData.setCurrentVolume(BigDecimal.ZERO);
//                                        } else {
//                                            snapData.setCurrentVolume(new BigDecimal(historyEntity.getVolume()));
//                                        }
//                                    }
//                                });
//                            }
//
//                        }
//                    }
//
//                } else {
//                    snapData.setCurrentVolume(new BigDecimal(snapData.getVolume()));
//                    snapData.setAmount(new BigDecimal(snapData.getPrice()).multiply(new BigDecimal(snapData.getVolume())));
//                }
//
//                QuoteStockInfoSnapData.DataBean lastSnapBean = allSnapList.get(allSnapListSize - 1);
//
//                String lastDealTime = lastSnapBean.getDealtime();
//                if (lastDealTime.contains("-0400")) {
//                    lastDealTime = lastDealTime.replace("-0400", "+0800");
//                } else if (lastDealTime.contains("-0500")) {
//                    lastDealTime = lastDealTime.replace("-0500", "+0800");
//                }
//                Date lastDate = new Date(lastDealTime);
//                DateTime lastSnapDateTime = new DateTime(lastDate.getTime());
//
//                int lastSnapMillisOfDay = lastSnapDateTime.getMillisOfDay();
//                int newSnapMillisOfDay = snapDateTime.getMillisOfDay();
//                //秒数不相同才把新快照数据添加到快照集合
//                if (lastSnapMillisOfDay != newSnapMillisOfDay) {
//                    allSnapList.add(snapData);
//                }
//            }
//
//            minData.setVolume(snapData.getCurrentVolume().doubleValue());
//            minData.setAvg(snapData.getCurrentAvg().doubleValue());
//
//
//            minData.setChange(snapData.getChange());
//            minData.setCurrent(price);
//            minData.setPercent(percent);
//            minData.setLast_close(prev);
//
//            minData.setTime(snapTimeStamp);
//            minData.setNYTime(originalTimeStamp);
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return minData;
//    }

//    /**
//     * 处理最后一分钟的数据
//     *
//     * @param data data
//     */
//    private void handleLastMinData(QuoteStockMinutesData.DataBean data) {
//        try {
//
//            //1.查看当前集合是否加载过数据
//            //2.已经加载过数据
//            //3.没加载过数据
//            if (minutesDataBeanList != null &&
//                    minutesDataBeanList.size() != 0) {
//                //判断时间
//                int dataSize = minutesDataBeanList.size();
//                int lastIndex = dataSize - 1;
//                QuoteStockMinutesData.DataBean oldData = minutesDataBeanList.get(lastIndex);
//                long oldTime = oldData.getTime();
//                long newTime = data.getTime();
//
//
//                DateTime oldDate = new DateTime(oldTime);
//                DateTime newDate = new DateTime(newTime);
//
//                if (newDate.toString().contains(AppBaseNetWork.americanStockCloseTime)) {
//                    minutesDataBeanList.remove(lastIndex);
//                    minutesDataBeanList.add(data);
//                    //将快照中16:00的时间转换为15:59
//                    long time = minutesDataBeanList.get(lastIndex).getTime();
//                    DateTime dateTime = new DateTime(time);
//                    DateTime lastDateTime = dateTime.minusMinutes(1);
//                    minutesDataBeanList.get(lastIndex).setTime(lastDateTime.toDate().getTime());
////                    //1.补全历史的空数据 与 快照前几分钟的空数据
////                    //a.补全历史空数据
////                    //b.补全快照前几分钟的空数据
////                    suppleMinuteNullData();
//
//                    view.updateHqInfo(minutesDataBeanList);
//
//                } else if (newDate.getMinuteOfDay() > oldDate.getMinuteOfDay()) {
////                    Log.e("mj###", "hq 分钟数大于旧的数据 minute price=" + data.getCurrent());
//                    //添加数据
//                    minutesDataBeanList.add(data);
////                    Log.e(TAG, "data str=" + newStr);
////                    //1.补全历史的空数据 与 快照前几分钟的空数据
////                    //a.补全历史空数据
////                    //b.补全快照前几分钟的空数据
////                    suppleMinuteNullData();
//                    view.updateHqInfo(minutesDataBeanList);
//
//                } else if (newDate.getMinuteOfDay() == oldDate.getMinuteOfDay()) {
////                    Log.e("mj###", "hq 分钟数相等 minute price=" + data.getCurrent());
//                    //替换数据
//                    minutesDataBeanList.remove(lastIndex);
//                    minutesDataBeanList.add(data);
////                    //1.补全历史的空数据 与 快照前几分钟的空数据
////                    //a.补全历史空数据
////                    //b.补全快照前几分钟的空数据
////                    suppleMinuteNullData();
//
//                    view.updateHqInfo(minutesDataBeanList);
//
//                }
//            } else {
//                //加载数据
////                如果时间点为9：30 则使用快照数据
//                long nyTime = data.getNYTime();
//
//                if (AppBaseNetWork.getInstance().judgeTimeIsMain(nyTime)) {
//                    quoteStockMinutesData = new QuoteStockMinutesData();
//                    List<QuoteStockMinutesData.DataBean> list = new ArrayList<>();
//                    list.add(data);
//                    minutesDataBeanList = list;
//                    quoteStockMinutesData.setData(list);
////                    suppleMinuteNullData();
//                    view.updateHqInfo(list);
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//    }

//    /**
//     * 补充分时空数据
//     */
//    private void suppleMinuteNullData() {
//        if (minutesDataBeanList == null) {
//            return;
//        }
//        try {
//            LinkedHashMap<Integer, List<QuoteStockMinutesData.DataBean>> nullDataMap = new LinkedHashMap<>();
//            List<Integer> nullDataIndex = new ArrayList<>();
//            int historyDataSize = minutesDataBeanList.size();
//            for (int i = 0; i < historyDataSize; i++) {
//                int j = i + 1;
//                //如果j等于集合大小则不进行 相邻对比
//                if (j != historyDataSize) {
//                    QuoteStockMinutesData.DataBean startBean = minutesDataBeanList.get(i);
//                    QuoteStockMinutesData.DataBean endBean = minutesDataBeanList.get(j);
//                    long startTime = startBean.getTime();
//                    long endTime = endBean.getTime();
//                    DateTime startDate = new DateTime(startTime);
//                    DateTime endDate = new DateTime(endTime);
//                    int startMinuteOfDay = startDate.getMinuteOfDay();
//                    int endMinuteOfDay = endDate.getMinuteOfDay();
//                    //num历史数据中相邻的两条数据差了几个点的数据 9：45-9：49 相差 4  但是差的数据为 9:46,9:47,9:48 三条数据
//                    int num = endMinuteOfDay - startMinuteOfDay;
////                    Log.e(TAG, "endMinuteOfDay=" + endMinuteOfDay + "--startMinuteOfDay=" + startMinuteOfDay);
//                    if (num <= 1) {
//                        continue;
//                    }
//
////                    Log.e(TAG, "num=" + num);
//                    //相差几条就补几次数据
//                    List<QuoteStockMinutesData.DataBean> tempList = new ArrayList<>();
//                    for (int n = 1; n < num; n++) {
//                        QuoteStockMinutesData.DataBean tempBean = minutesDataBeanList.get(i);
//                        DateTime tempDate = new DateTime(tempBean.getTime());
//                        DateTime lastTime = tempDate.plusMinutes(n);
//                        tempBean.setTime(lastTime.toDate().getTime());
//                        tempBean.setVolume(0);
//                        tempList.add(tempBean);
//                    }
//
//                    nullDataIndex.add(i);
//                    nullDataMap.put(i, tempList);
//
//                    //                minutesDataBeanList.addAll(i, tempList);
//                    //                通过递归去遍历
//                    //                view.updateHqInfos(minutesDataBeanList);
//                    //                suppleMinuteNullData();
//                    //                break;
//                }
//            }
//
//            if (nullDataIndex.size() != 0) {
//                int tempIndex = 0;
//                for (int i = 0; i < nullDataIndex.size(); i++) {
//                    Integer index = nullDataIndex.get(i);
//                    if (index != null) {
//                        List<QuoteStockMinutesData.DataBean> list = nullDataMap.get(index);
//                        if (list != null && list.size() != 0) {
//                            if (i == 0) {
//                                tempIndex = index;
//                            } else {
//                                tempIndex += list.size();
//                            }
//                            minutesDataBeanList.addAll(tempIndex, list);
//                        }
//                    }
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//
//    }

}
